
package Domein;

import GUI.Controller;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author Tim
 */
public class ServerThread extends Thread {
    private ArrayList<Controller> spelers;
    /**
     *
     */
    public boolean iedereenIngelogd;
    boolean running = true;
    private Server server;

    /**
     *
     * @param server
     */
    public ServerThread(Server server) {
        this.server = server;
    }

    /**
     *
     */
    public void stopThread() {
        running = false;
    }

    /**
     *
     * @param spelers
     */
    public void setSpelers(ArrayList<Controller> spelers) {
        this.spelers = spelers;
    }

    public void run() {

        while(true){
            try {
                Thread.sleep(10);
            } catch (InterruptedException ex) {
                System.out.println("Interrupted: " + ex.getMessage());
            }
            if(spelers != null) {
               int aantalSpelers = spelers.size();
               int isActive = 0;
               if(aantalSpelers > 0) {
                    for(int i = 0;i < aantalSpelers;i++) {

                        Controller huidigeSpeler = spelers.get(i);
                        SpelerDeelname deelname = (SpelerDeelname)huidigeSpeler.ronde.deelname.get(i+1);
                        deelname.aanDeBeurt(huidigeSpeler.tafel.ct);
                        
                        boolean kaartenzien = false;
                        for(int j = 1;j <= aantalSpelers;j++) {
                            if(!huidigeSpeler.ronde.deelname.get(j).handen.get(0).ingezet()) {
                                kaartenzien = false;
                                break;
                            } else {
                                kaartenzien = true;
                            }
                        }
                        if(kaartenzien) {
                            huidigeSpeler.tafel.showKaarten();
                            deelname.kaartenZichtbaar();
                        }
                        
                        int aantalHanden = deelname.handen.size();
                        for(int j = 0;j < aantalHanden;j++) {
                            Hand huidigeH = deelname.handen.get(j);

                        if(deelname.handen.get(0).activeHand){
                            isActive++;
                        }
                    }

                }

                    if(isActive == 0){
                        for(int i = 0;i < aantalSpelers;i++) {
                        spelers.get(i).tafel.showBankCard = true;
                        }

                        System.out.println("Bank aan de beurt");
                        Controller huidigeSpeler = spelers.get(0);
                        Bank bank = (Bank)huidigeSpeler.ronde.deelname.get(0);
                        try {bank.aanDeBeurt(huidigeSpeler.tafel.ct); } catch (Exception ex) {}
                        server.refreshTafels();
                        if(!bank.handen.get(0).activeHand){
                            System.out.println("Uitbetalen..!!");
                            System.out.println("Kaarten Bank: " + bank.handen.get(0).getKaarten());
                            String melding = "";
                            if(aantalSpelers > 0) {
                                for(int i = 0;i < aantalSpelers;i++) {
                                    Controller spelerUitbetalen = spelers.get(i);
                                    SpelerDeelname deelnameUitbetalen = (SpelerDeelname)spelerUitbetalen.ronde.deelname.get(i+1);
                                    System.out.println("Speler "+ deelnameUitbetalen.speler.getGebruikersnaam() + " uitbetalen.");
                                    melding += "" + deelnameUitbetalen.speler.getNaam() + " " + deelnameUitbetalen.speler.getTussenvoegsel() + " " + deelnameUitbetalen.speler.getAchternaam();
                                    for(Hand huidigeHand : deelnameUitbetalen.getHanden()) {
                                       System.out.println("Kaarten: " + huidigeHand.getKaarten());
                                       int kaartenSom = huidigeHand.getTotaalwaarde();
                                       int kaartenSomBank = bank.handen.get(0).getTotaalwaarde();
                                       Double inzet = huidigeHand.inzet;
                                       double verzekerSaldo = 0.0;
                                       if (huidigeHand.isVerzekerd())
                                           verzekerSaldo = huidigeHand.verzekerSaldo;

                                       if (huidigeHand.isVerzekerd() && kaartenSomBank == 21) {
                                           deelnameUitbetalen.uitbetalen(huidigeHand.verzekerSaldo);
                                           melding += " krijgt verzekering terug omdat de bank Black Jack heeft.\n\r";
                                       } else if (!(kaartenSom > 21)) {
                                           if (kaartenSom == 21) {
                                               System.out.println("21!");
                                               deelnameUitbetalen.uitbetalen(inzet-verzekerSaldo+(3.0/2.0*(inzet-verzekerSaldo)));
                                                melding += " heeft Black Jack!\n\r";
                                           } else if (kaartenSomBank > 21) {
                                               System.out.println("Bank is dood");
                                               deelnameUitbetalen.uitbetalen(2*(inzet-verzekerSaldo));
                                               melding += " wint omdat de bank dood is.\n\r";
                                           } else if (kaartenSom > kaartenSomBank) {
                                               System.out.println("Meer dan bank");
                                               deelnameUitbetalen.uitbetalen(2*(inzet-verzekerSaldo));
                                                 melding += " heeft een hoger punten aantal dan de bank!";
                                           } else if (kaartenSom == kaartenSomBank){
                                               System.out.println("Gelijk als bank");
                                               deelnameUitbetalen.uitbetalen(inzet-verzekerSaldo);
                                               melding += " krijgt zijn inzet terug omdat hij het zelfde aantal punten als de bank heeft.";
                                           }else if (kaartenSom < kaartenSomBank){
                                               melding += " heeft minder punten dan de bank.\n\r";
                                           }
                                       } else {
                                           melding += " is dood.\n\r";
                                       }
                                    }
                                }
                            }
                            server.refreshTafels();
                            try {
                                Thread.sleep(2000);
                            } catch (InterruptedException ex) {
                                System.out.println("Interrupted: " + ex.getMessage());
                            }
                            JOptionPane.showMessageDialog(null, melding, "Speloverzicht", JOptionPane.ERROR_MESSAGE);
                            server.nieuweTafel();
                            
                            for(int i = 0;i < aantalSpelers;i++) {
                                spelers.get(i).tafel.hideKaarten();
                                SpelerDeelname deelname = (SpelerDeelname)spelers.get(i).ronde.deelname.get(i+1);
                                deelname.kaartenOnzichtbaar();
                            }
                            
                        }
                    }
            }
        }
    }


    }
}

